約 2,528,992 件
https://w.atwiki.jp/ohden/pages/290.html
SQLite install ◆環境 Ubuntu 10.04LTS 最新らしいtarballの取得。 wget http //www.sqlite.org/sqlite-3.7.3.tar.gz 解凍。 tar zxvf sqlite-3.7.3.tar.gz で、README見ると、定番で良さそうなので... cd sqlite-3.7.3/ ./configure make sudo make install paco入れとる場合は、『sudo paco -D make install』。 installの確認。 sqlite3 -version 3.7.3 okっぽぃ。(*´ω`)b 更新日: 2010年12月03日 (金) 10時21分12秒 名前 コメント すべてのコメントを見る
https://w.atwiki.jp/irukakiss/pages/65.html
SQLite入門 西沢直木著 お勉強ノート ネタばらしにならない範囲で、感心したことや感想や大事なことを書きとめておく。 1.バージョンに関して SQLite3は2004年6月から。だとすれば、いまだにVer2を使うのはどうかと思う。 Ver3のDBFは同じ内容のVer2のDBFの6割程度のサイズになる。この点でもVer3だろ。 2.セキュリティーに関して アクセス制限を.htaccessでかける。(P.10) 3.ファイル、データに関して データベースのファイル名の拡張子は任意。なくても良い。 データ型は指定しないで良い。 そうすると例えば年齢とか数字を入れてもTEXTとなってソートがおかしくなるが、CAST文により、フィールドを数値と定義できる。(P.17) 4.コマンドラインツールに関して http //www.sqlite.org/download.html の中ほどの Precompiled Binaries For Windows の下の sqlite-shell-win32-x86-3070701.zip(244.12 KiB) をダウンロード 解凍すると、sqlite-shell-win32-x86-3070701フォルダにsqlite3.exeがある。これをcドライブ直下に置く。フォルダ名は長いのでsqliteにする。 コマンドラインからcd c \sqlite\ sqlite3 db1.db db1.dbというデータベースへのコマンド受付状態になる。 ... 何だよ。... ... はじめこればっかりだ。文字化け以前の問題。エラーすら出ない。 終わるときは.exitまたは[ctrl]+[c]キー。... は[ctrl]+[c]キーでしか終われんぞ。暴走か、フリーズか。(後でわかったけど、これ、改行したら表示される。sqlite文は最後;セミコロンで終わるのでそれを書かずにEnterキーを押すとこのマークが出る。セミコロン打てば少なくともエラーは出てくれる。) [F3]キーと↓↑で履歴表示。 文字化けし過ぎ。狂ったように日本語全部文字化け! http //javastring.blog55.fc2.com/blog-entry-51.html プロンプトのショートカット→プロパティでフォントを日本語フォントに変更。MSゴシックあたりで。 さらに C \ chcp 65001 おーこれで見えたぞ! ところで、ごちゃごちゃやってたらコマンドプロンプトがアメリカ表記になって元にもどらない。そういう時はchcp 932にすれば元に戻る。 しかし、毎回chcp 65001 っていうのも何か使いにくい。かといってショートカットを変更するみたいにすると米国表記になったりで…。わからん。わからん。わからん。わからん。 http //d.hatena.ne.jp/perlcodesample/20080706/1215291523 ショートカットのリンク先を%SystemRoot%\system32\cmd.exe /f on /k "chcp 65001"にする。つまり /f on /k "chcp 65001"を加える。 文字化け以前の問題。ど素人だからコマンドラインツールを動かす以前にこれだけ悩む。... ざっと丸1日。... コマンドラインですらこれだよ。... どうせまたPHPで文字化けに悩むに決まってる。... 夜の海を一人乗りのボートで行くようなもんだ。座礁と転覆の連続。本のサンプルを再現するだけでもこれだけの壁がある。あきらめなければいつかはできる。しかし、それは若いときの話。今や時間がいくらでもあるはずもない。あきらめるまえに寿命が来れば実現などできない。アミーゴに4万払えばこんな事をする必要なんてない。ケチったからか?プライドの問題か?妻は4万払えばいいという。それは現実的に正しい選択だ。しかし、俺はアミーゴの世話になったことはよくわかっているが、それゆえにそこから卒業したい。アミーゴ、これまでありがとう。でも、いつまでもあんたの世話になるわけにはいかないんだよ。Thank you and Good bye! 5.コマンド、文に関して 文は;セミコロンで終わる。.コマンドの場合、.ピリオドが前につく。;セミコロンは要らない。 6.データベース作成に関して データベースファイルの拡張子は任意。なくてもいい。僕は.dbにする。(ここから、SQL文などをコピペでコマンドラインツールに入れて検証。@WikiはUTF-8なので丁度いい。しかしその場合、chcp 932で元に戻さないとだめ。) sqlite3 db1.db でdb1.dbデータベースファイルに接続かそれが無ければ作られて接続される。 7.テーブルに関して create table tbl1(id,name,home);で3つのフィールドのテーブルができる。型指定無しだと手軽。テーブル名はアルファベットではじめる。数字からはNG。table等の予約語は""or で囲めば使えるが使わないのが無難。 .schemaコマンドでテーブルを確認できる。 create table tbl1(id integer primary key,name,home);のようにidフィールドをinteger primary keyと定義すると自動連番が生成され、データ入力しなくていい。主キーフィールドの定義になる。 alter table tbl1 add column age;でageフィールドが追加される。 drop table tbl1;でテーブル削除。vacuum;で記録域が開放され、データベースの容量が小さくなる。 8.データの追加、変更、削除に関して insert into tbl1(name,home,age) values( 田中一郎 , 千葉県 , 30 );のようにフィールドを指定して値をセットできる。自動連番フィールドは入れなくてよいから書くこともない。フィールドを指定しないときは、 insert into tbl1 values( 2 , 加藤次郎 , 北海道 , 20 );全部のフィールドを書いて1件分のデータを追加。insert into tbl1 values(null, 加藤次郎 , 北海道 , 20 );とすれば、自動連番で後ろに1件追加される。 insert into tbl1(name,home,age) values( 岡田三郎 , 京都府 , 25 ); insert into tbl1(name,home,age) values( 山田四郎 , 埼玉県 , 28 ); insert into tbl1(name,home,age) values( 野口五郎 , 東京都 , 40 ); insert into tbl1(name,home,age) values( 永六輔 , 山形県 , 30 ); 上記ダミーデータを入れてselect * from tbl1;で全件表示。 update tbl1 set home= 東京都 where id=1;で1番目のデータの出身地が東京。update tbl1 set home= 千葉県 where id=1;まあ戻しとこう。update tbl1 set age=age*2;で全員の年齢が倍。update tbl1 set age=age/2;まあ戻しとこう。 データを置き換えるreplace文もある。 delete from tbl1 where id 6;とすれば7番目以降削除。vacuum;文実行で容量縮小。where句のないdelete文でテーブル全データ削除。 9.データの表示に関して ここまでやってきて、ようやくおぼろげながらSQLがどんなもんかわかってきた。少し友達になれた。とっつきにくいやつだけどね。何でコマンドラインツールなんてやるんだとその意味もわかってなかったが、SQL文を理解するにはこれがいちばん早いでしょう。GUIでSQL文書いてもいいでしょうけどね。表示まで一通りやれば、PHPからの呼び出しに行こう。今日(9/15)はまあまあ進んだ。仕事もある程度忙しかったが忙中閑ありで。進んだり、ぶつかったり、転覆したり、流されたり、また進んだりプログラム言語の勉強にだって物語はあるんだ。 select * from tbl1;これまで何度もやったが「*」はワイルドカード。全件表示。 select name from tbl1;名前だけ、select home from tbl1;出身地だけ、select name,age from tbl1;名前と年齢、select name as 名前,age as 年齢 from tbl1;as句をつけるとフィールドの別名が表示される。 とここまでやってフィールド名なんて全然見たこともないことに気づく。SQLiteの設定をやる必要アリ。.showで設定一覧表示。フィールド名を表示するには.headers onでいけた。 select * from tbl1 order by id desc; order by句によるソート。この場合id番号降順。年齢昇順ならselect * from tbl1 order by age asc;名前昇順ならselect * from tbl1 order by name asc; 何だこれ?漢字コード順?カナだったらどうだろう。 alter table tbl1 add column kana; でフィールド追加して、 update tbl1 set kana= タナカイチロウ where id=1;あとはidを変えながらカトウジロウ、オカダサブロウ、ヤマダシロウ、ノグチゴロウ、エイロクスケと入力後select * from tbl1 order by kana asc; id|name|home|age|kana 6|永六輔|山形県|30|エイロクスケ 3|岡田三郎|京都府|25|オカダサブロウ 2|加藤次郎|北海道|20|カトウジロウ 1|田中一郎|千葉県|30|タナカイチロウ 5|野口五郎|東京都|40|ノグチゴロウ 4|山田四郎|埼玉県|28|ヤマダシロウ こんな感じでカナはちゃんと並ぶ。 where句でidが4以上のデータに絞込み→select * from tbl1 where id 3; in句でidが1と4のデータに絞込み→select * from tbl1 where id in(1,4); between句でidが2~4のデータを取出す→select * from tbl1 where id between 2 and 4; limit/offset句で2件飛ばして1件取出す→select * from tbl1 limit 1 offset 2; 集約関数でフィールドの平均、件数、合計、最大、最小などいろいろわかる。 こりゃ、使えるようになればいいページができるね。
https://w.atwiki.jp/gonjoukk/pages/21.html
このページのメモ内容は、 centOS上での設定方法である 既にデフォルトのsqliteでアプリケーションが作成されているものを、mysqlへ変更する場合である ①Gemfileを変更 gem sqlite3 → gem mysql2 ②database.ymlの内容を変更 アプリ名/config/database.yml default default adapter mysql2 encoding utf8 pool 5 username root password # - mysqlインストール時に設定したパスワード 例 1 socket /var/lib/mysql/mysql.sock development *default database asago_development #アプリ名_development test *default database asago_test #アプリ名_test production *default database asago_production #アプリ名_production username asago #アプリ名 password %= ENV[ TESTMYSQL_DATABASE_PASSWORD ] % ③データベースを作成 $ rake db create ④作成されているマイグレーションを実行 $ rake db migrate
https://w.atwiki.jp/sami1127/pages/14.html
なんかよく導入方法が分からなかったので今まで放置していましたが、サンプルコード動かしたくて再度挑戦。。。 なんでWindows環境だと情報ちれぢれなんだよーっ SQLite3のDLLファイル取得 www.sqlite.org ここのDownloadからDLLファイルをげと。 パスが通ったトコにDLLファイルを置く。 ↑分かりやすいように C \ruby\bin 直下に置いてみた。 ・プロンプトでインストール この時注意しなきゃいけないのが、Versionを指定してインストールすること! 最新ファイルだと Windows用のバイナリが配布されていません という恐れがあり、ただ単に gem install sqlite3-ruby とやっても nmake nmake は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 と出てしまい、インストールできなかったりするようです。。。 なので、 gem install sqlite3-ruby --version=1.2.3 とVersionを指定してインストールしないといけないです。 以上! 最後のところでどんだけハマったんだーって感じですが。。。orz 何とかできたー!!これでsqlite3使ったサンプルPJ持ってきてもそのまま実行できるー!!
https://w.atwiki.jp/irukakiss/pages/69.html
自宅サーバー・Apche・PHP・PDO・SQLite環境でのメモ帳アプリの活用 メモ帳アプリはすべてが入っている教材でもあるが、実際そのまま使える道具でもある。これをサーバーに置いて本文にHTMLやXMLを書けば、それらの文はそのままWEBページに表示できるでしょ。 極端な話、WEBページのすべての文をデータベースからデータとして拾ってきて構成することもできる。 そこまでやることはないが、例えば新着情報や、日替わりメニューや、リンクや、RSSや、その他頻繁に更新する部分はデータベースのデータとしておけば何時でもどこでもブラウザさえ開ければメモ帳アプリにアクセスして編集できるのだ。極端な話、携帯からでもできるだろう。FTPサーバーもFTPソフト必要ない。 僕は自宅のWindowsパソコン1台をWEBサーバーにしているが、メールはもちろんFTPもやっていない。ポートを開けると、何かと面倒なので。更新は直接書きかえるか、@WikiのFTPにHTML文などを入れて、それを参照している部分はそのファイルを書きかえている。データベースにホームページの内容が入っていれば、そうした不便から開放される。サーバーはWEBサーバーだけでよい。 メモ帳アプリの具体的な使い方 公開しているディレクトリにメモ帳アプリを置かないと「いつでも、どこでも」更新できないので意味がない。公開ディレクトリに置くためには自分(または管理者)しか操作できないように一応の対策をする。国家機密じゃあるまいしそんなに大そうには考えず、PHPによるベーシック認証ですませる。レッツPHP!の小物の中の-パスワード制限-のプログラムを使わせていただく。レッツPHP!というサイトは本当に好感が持てる。シンプルなのによーく考えられている。メモ帳アプリのプログラムの先頭にinclude_once( auth.php );と書くだけでベーシック認証しないとプログラムが走らないようになるのだ。無論パスワードを書いたテキストファイルは公開ディレクトリ以外に置いてフルパスで指定。こうすればかなり悪意がない限りデータを書きかえられることはない。なお、SQLiteのデータベースファイルはこれも公開ディレクトリより上に置けばダウンロードされることもない。かなりセキュア。 メモ帳アプリで「新着情報」、「お知らせ」などのHTMLやRSSのXMLを登録し、実際にそれらを表示するページに次のようなPHPを挿入すればちゃんと表示される。これによって、「いつでもどこでも」手軽に内容を更新できるというわけ。FTPサーバーも、FTPソフトもいらない。ブラウザさえ開くことができる環境なら世界中どこからでも自宅サーバーの更新ができる。 メモ帳アプリに習ってプリペアでやるなら、 ?php // データベースに接続 $conn = new PDO( sqlite memo.sqlite ); $sql = SELECT * FROM memo WHERE id = 5 ; $stmt = $conn- prepare($sql); $stmt- execute(); $row = $stmt- fetch(PDO FETCH_ASSOC); echo $row[ contents ]; $conn = null; ? まあ、でも普通はクエリにSQL文を書くでしょ。 ?php $conn = new PDO( sqlite memo.sqlite );// データベースに接続 $stmt = $conn- query( SELECT * FROM memo WHERE id = 5 );//検索 $row = $stmt- fetch(PDO FETCH_ASSOC);//行全体を連想配列として取得 $conn = null;//接続を切る echo $row[ contents ];//本文を表示 ? この例ではidで検索しているが、titleで「新着情報」とか「お知らせ」とかで検索したほうがわかりやすいと思う。 ?php $conn = new PDO( sqlite 相対指定パス/memo.sqlite );// データベースに接続 $stmt = $conn- query( SELECT contents FROM memo WHERE title = 新着情報 );//検索 $row = $stmt- fetch(PDO FETCH_ASSOC);//行全体を連想配列として取得 $conn = null;//接続を切る echo $row[ contents ];//本文を表示? 普通に表示すると、なぜか「 」だとか漢字の「定」の文字だとかの前にやたらとバックスラッシュが入る。PHPでは普通にあることなのか、それを取り除く関数があるのだ。stripslashesというやつです。これを使えば解決。 だけど根本はフォームでPOSTする度にセキュリティーの関係でこうなるらしい。それで、フォームからのPOSTを受ける$_POSTという連想配列のようそについて、stripslashesを施してやれば、全て解決する。メモ帳アプリであれば、 // データの取得 $act = (isset($_POST[ act ])) ? $_POST[ act ] ; $id = (isset($_REQUEST[ id ])) ? intval($_REQUEST[ id ]) ; $contents = (isset($_POST[ contents ])) ? stripslashes($_POST[ contents ]) ; $title = (isset($_POST[ title ])) ? stripslashes($_POST[ title ]) (無題) ; $dt = date( Y-m-d H i s ); ここのところでやれば他のところは何もしないほうがいい。いろんなところでやると、5C問題にぶち当たる。「ソ」や「表」が文字化け。これは、\を取り除きすぎなんだよ。めったやたらととっぱらっちゃ駄目です。 stripslashesは$_POSTで使えば次のfgetcsvであろうが、shift-jisでも問題なく使える。 メモ帳アプリを改造してCSVファイルをインポート CSVのインポートはGUIやコマンドラインツールに用意されているが、実際やったら文字化けで無理。調べると、SQLiteはUTF-8でないと駄目で、HTMLもUTF-8にしろっていうこと。今更そんなのやってられない。そういう流れだったら逆らえないし、いずれやることになるだろうが、率先してやることはない。SHIFT-JISでいいじゃないか。ふつうにSQLite使えていると思うんだがね。要するにはじめから用意されているやつでやったら、文字化けでお手上げ。この辺のことに悩み出したら、どれだけ時間がかかるかわからない。アミーゴで作ったDBのファイルはCSVにできるので、ともかくこれをさっさとインポートしないと話が始まらない。 というわけで、不器用でも力ずくで、インポートする。PHPのfgetcsvで1行ずつ読み込み、メモ帳アプリのadd_dataファンクションで書き込んでいけばよいだけのこと。文字化けに悩む時間のことを思えば手間はましというもの。 9個ぐらいのフィールドで、ためしにやってみたが110行ほどのCSVをインポートするのに5秒ぐらいかかるかな。1万行じゃあるまいし。この時間は問題にならない。 ポイントは、fgetcsvでCSVデータを1行ずつ読み込んでファイルが終わるまで配列に入れるという原始的方法。 POSTで、読み込むCSVファイルのファイル名のみを取得している。これは当てずっぽうがたまたま当たっているような感じで、邪道かもしれない。普通はフォームで、enctype= multipart/form-data を指定してPOSTすれば$_FILES[ file ][ name ]にファイル名が返るはずだが、どうもそれがうまくいかない。 enctype= multipart/form-data をしなかったら$_POST[ file ]にファイル名が入るのだ。事実として。それでいいじゃないか。できるんだから。 html !-- 1.このプログラムは生成したいデータベースファイルを置く場所(ディレクトリ)と同じ場所に置く。 2.さらに、インポートするcsvファイルを同じ場所に置く。 3.生成するデータベースファイル名確認(69行目 menu.sqlite)。 4.生成するテーブル名確認(72,90,115行目 menu)。 5.このプログラムをブラウザで実行する。 6.インポートするcsvファイルを参照して指定。 7.インポートボタンを押す。 -- head meta http-equiv= Content-Type content= text/html; charset=Shift_JIS title メニューアプリケーション(PDO関数)CSVファイルインポート用 /title meta http-equiv= content-style-type content= text/css style type= text/css !-- .sfont{ font-size 12px } -- /style /head body class= sfont h4 メニューアプリケーション(PDO関数)CSVファイルインポート用 /h4 ?php // データの取得 $act = (isset($_POST[ act ])) ? $_POST[ act ] ; $impfn = (isset($_POST[ impfn ])) ? stripslashes($_POST[ impfn ]) ;//インポートするcsvファイル名 //$dt = date( Y-m-d H i s );//インポートファイルの最終更新日時を採用するときはこの行コメントアウト※54行目を使う // データベースの初期設定 $conn = init(); //処理 if ($act == インポート and $impfn ) { //CSVファイルを開く //$fnで指定するファイルを読み取りモードで開く $fn=$impfn; $fp = fopen($fn, r ); //CSVファイルのパスとファイル名 //CSVデータを1行ずつ読み込んでファイルが終わるまで配列に入れる。 $counter = 1; while ($data = fgetcsv($fp, 10000)) { //変数に代入 //$id=$data[0]; $name=$data[1]; $comment=$data[2]; $hyou=$data[3]; $kakaku=$data[4]; $kakaku2=$data[5]; $bunrui=$data[6]; $aji=$data[7]; $dt=$data[8];//インポート時の最終更新日時を採用するときはこの行コメントアウト※31行目を使う add_data($conn, $name, $comment, $hyou, $kakaku, $kakaku2, $bunrui, $aji, $dt); //Wile文の終端 $counter++ ; } //ファイルを閉じる fclose($fp); //if文の終端 echo $impfn. をインポートしました。 ; } // データベースの初期設定 function init() { // データベースに接続(カレントフォルダのmenu.sqliteというファイル名) $conn = new PDO( sqlite menu.sqlite ); // データベースの作成 $sql = CREATE TABLE IF NOT EXISTS menu ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, comment TEXT NOT NULL, hyou, kakaku, kakaku2, bunrui, aji, dt TEXT NOT NULL ) ; $stmt = $conn- prepare($sql); $stmt- execute(); return $conn; } // データの追加 function add_data($conn, $name, $comment, $hyou, $kakaku, $kakaku2, $bunrui, $aji, $dt) { $sql = INSERT INTO menu(name, comment, hyou, kakaku, kakaku2, bunrui, aji, dt) VALUES( name, comment, hyou, kakaku, kakaku2, bunrui, aji, dt) ; $stmt = $conn- prepare($sql); $stmt- bindParam( name , $name); $stmt- bindParam( comment , $comment); $stmt- bindParam( hyou , $hyou); $stmt- bindParam( kakaku , $kakaku); $stmt- bindParam( kakaku2 , $kakaku2); $stmt- bindParam( bunrui , $bunrui); $stmt- bindParam( aji , $aji); $stmt- bindParam( dt , $dt); $stmt- execute(); $id = $conn- lastInsertId(); return $id; } ? !-- フォーム -- form method= POST action= ?php echo $_SERVER[ SCRIPT_NAME ]? input type= file name= impfn size= 30 input type= submit value= インポート name= act onClick= return confirm( インポートします ) /form ?php // 全データの取得 $sql = SELECT * FROM menu ORDER BY id ; $stmt = $conn- prepare($sql); $stmt- execute(); // データの一覧表示 echo table class=\ sfont\ border=\ 1\ ; echo tr ; echo td ID /td ; echo td 名称 /td ; echo td 得票 /td ; echo td 価格 /td ; echo td 最終更新時刻 /td ; echo /tr ; while ($row = $stmt- fetch()) { echo tr ; echo td . $row[ id ] . /td ; echo td . $row[ name ] . /td ; echo td . $row[ hyou ] . /td ; echo td . $row[ kakaku ] . /td ; echo td . $row[ dt ] . /td ; echo /tr ; } echo /table ; ? /body /html ともかくこれで、アミーゴのデータを全部SQLiteに移行した。文字化けなし。 全くなし。 SHIFT-JISであろうとfgetcsvであろうと文字化けなし。 $_POSTだけバックスラッシュ取ればいいのだ! 文字化けアレルギーにかかっていた。 stripslashesは、やたらと使うもんじゃない。これを使いすぎて、\が無くなって,逆に5C問題が発生する。基礎的な設定が正しければstripslashesはPOSTを受けた直後の$_POSTにだけ施せばよろしい。例えば、stripslashes($_POST[ comment ])みたいにPOSTを受ければそれで何もかもうまくいく。下手に対処療法ばかりやってはいけない。対処療法が症状を生みさらに対処療法をするとそれがまた症状を生むという悪循環に陥る。おおもとの部分を解決しなければ永遠のいたちごっこになる。 カクテルはさすがに26種類のフィールドで、486行だから時間がPHP既定の30秒では足りず、 Fatal error Maximum execution time of 30 となった。 プログラムの先頭に秒数を書く。120秒でどうだ。 set_time_limit(120); 結果、65秒であった。2年かけて入力したデータだからな。65秒ぐらいかかってくれたほうがうれしい。 $conn = new PDO( sqlite パス/cocktail.db );// データベースに接続 $stmt = $conn- query( SELECT count (*) FROM cocktail where {$where} );//countで、セレクトされる行数を取得する。 $total = $stmt- fetchColumn();//カウントの結果はこれで。なお(*)は(id)などnotnullのフィールドでもいい。 $conn = null;//接続を切る 検索結果の表示でページャー(ページ送り機能)を使いたかったので、検索結果件数を上のコードで取得。{$where}はWhere句の内容。 ページャーはレッツPHPさんのお世話になりました。よくできたプログラム。わかりやすいし。 http //php.s3.to/simple/
https://w.atwiki.jp/irukakiss/pages/68.html
PHP5.2のPDOでSQLiteを使う ApacheでPHPを使うならPHP5.2だ。それならSQLiteはよほどの抜き差しならぬ理由が無い限りPDOでやるべき。選択の余地は無い。SQLite3を使うべきだから。そんな当たり前のことすらよくわかっていなかったというところからスタートした。少しはわかってきた。 このページはコードをたくさん書いているのでText Hatenaモードにした。Wikiモードだとコードに反応してしまうので。 SQLite入門 西沢直木著 のサンプルアプリ、メモ帳アプリというのがあって、それを使いつつ、読みつつPHPからSQLiteを使うノウハウをネタばらしにならない範囲で、書きとめておく。 メモ帳アプリは公開されている。 http //www.seshop.com/book/download/ ここでSQLiteで検索すれば、ダウンロードのリンクがある。 これは、ネタばらしじゃないでしょ。WEBにあるんだし。これを読みながら勉強しようと思う。 1.とりあえず起動 中身は知らないがとりあえず動かそうと思ってhtdocs\に置いて、http //localhost/memo-pdo.phpを見たが白紙だよ。因みにSQLite3はPDOだと思うのでそれやったんだけど・・・。PHP5.3だけどPDOも使えるようにしてるつもりだけど…。でも、データベースファイルらしきものはできているので、一応動いているのか。エラーすら出ない。真っ白。意味わからん。動いてる?IEのタイトルバーにタイトルすら出ないぜ。はあー? こういう時は、変なわけのわからんことになってる。絶対エラーかタイトルぐらい出るはず。原因は追究するな!対症療法だ。というわけで、ez-HTMLでこいつを開き、(ポコッと音がする。なんかおかしい。)新規PHPページを作り、そこへこいつを全部コピペする。そしてコピペしたファイルをmemo-pdo.phpに上書き。要するにクリップボードでテキスト以外を除外するフィルタをかけたようなもんだ。CもVBもPHPもCGIもHTMLもCSSもSQLだって何だってTEXTで書かれてるんだろ?だからTEXT以外は要らないんだよ。案の定動いた。 後日談(9月17日)どうもこのような挙動不審はApacheでPHP5.3を使っているから?という感じがして今はPHP5.2に戻した。SQLiteは無論バージョン3を使うので、PDO関数を使う。PHP5.2であればこのような挙動不審はない。 2.データを入れてみる これ、掲示板みたいなもんだな。題名と本文のテキストエリアがあって、新規作成でいくつでも登録できて、題名の一覧が下に出てそれらはデータにリンクしている。リンクをクリックしてデータを呼び出し、テキストエリアの内容を変えれば変更ができる。チェックボックスをチェックして削除ボタンを押せばそのデータは削除される。シンプルだが、多くのノウハウが詰まっているな。いい教材だと思う。ややこしくなるからエラー処理はない。その方がいい。ところで、PHP5.3だからか、日付の書き方がどうかしてるのか警告が出る。Warning date() [function.date] これはエラーというわけでもなくプログラムはちゃんと動く。どうせPDOでやるので、PHP5.2に戻す 教材としてではなく実用にもなりそう。自宅サーバーはWEBサーバーのみだが、これを使えば頻繁に更新する部分のコードをデータとしてアップできるので、FTPサーバーを立ち上げるまでもない。 このプログラムにはほとんど僕がやろうとしていることのすべてが入っている。片っ端から読み解いてまとめ、あとは改造していく形で目的は達成できると思う。 僕にとってプログラムを読むというのは日本語訳するということ。1行ずつ1句ずつ何をしているのかを日本語で書くこと。プログラムは言語であり、言語であるからには日本語で表せるはずである。日本語で表した時にものすごい量になるから各種のプログラム言語で表すのだ。僕はこの量的な問題だけによってプログラム言語があると思っている。こうしなさい、ああしなさい、こういうときはこうしなさい、そういうことを簡潔に書ける言語としてプログラム言語がある。ただし、簡潔であればあるほどわかりにくい。簡潔とわかりやすさの兼ね合いをどこに取るかがスキルである。スキルの高い人は簡潔。僕みたいにスキルの低い人はわかりやすさを重点に置く。唯一気を付けるべきは、「わからんのにわかったように話をすすめてはいけない」ということ。自分がわからない限り決して先に進まない。PHPについてもほとんどわかっていないのでこのプログラムを読むのにはかなり努力が要る。 よく「猿でもわかる」とか「犬でもわかる」という表現をする人が居るが、猿や犬にもプログラムはもしかして理解させることができるかもしれないが、それよりは日本語に訳す方が労力は少ないと思う。 読解1.データの取得(変数の初期化)まで コメント以外のコードはメモ帳アプリケーション(西沢直木氏作)より引用 html !-- html文書のbodyにPHPを書く。 -- head title メモ帳アプリケーション(PDO関数) /title /head body h3 メモ帳アプリケーション(PDO関数) /h3 !-- 小見出し -- ?php // データの取得 //ここからPHP。データの取得というより変数の初期化。 $act = (isset($_POST[ act ])) ? $_POST[ act ] ; //$actという変数は「新規作成」とか「保存」などの行為(action)を示す値をとる。 //?は三項条件演算子(a? b c aが真ならb,偽ならc)C言語でよく使う。IF文の方がわかりやすいけど。 //isset(変数)は変数がセットされているどうか調べてセットされていればTRUE、されていなければFALSE。 //$_POST[ act ]はフォームのPOSTメソッドのinputでactという名前でブラウザから要求された値がセットされる変数。 //結局$actは$_POST[ act ]に値があればその値とし、なければNULLとする、ということ。 $id = (isset($_REQUEST[ id ])) ? intval($_REQUEST[ id ]) ; //$_REQUEST[ id ]は、GETメソッドかPOSTメソッドでidという名前でブラウザから要求された値がセットされる変数。 //POSTメソッドとGETメソッドの違いはhttp //nyx.pu1.net/practice/external_var/external_var2.php //要するにフォーム以外のハイパーリンクとかのブラウザからの要求は全部GETメソッド。 //intvalは整数の数値。 //結局、結局$idは$_REQUEST[ id ]に値があればその整数値とし、なければNULLとする、ということ。 $contents = (isset($_POST[ contents ])) ? $_POST[ contents ] ; //$contentsは本文。 //$_POST[ contents ]はフォームのPOSTメソッドのinputでcontentsという名前でブラウザから要求された値がセットされる変数。 //結局$actは$_POST[ contents ]に値があればその値とし、なければNULLとする、ということ。 $title = (isset($_POST[ title ])) ? $_POST[ title ] (無題) ; //$titleは題名。 //$_POST[ title ]はフォームのPOSTメソッドのinputでtitleという名前でブラウザから要求された値がセットされる変数。 //結局$actは$_POST[ title ]に値があればその値とし、なければ(無題)とする、ということ。 $dt = date( Y-m-d H i s ); //$dtに現在の日付と時刻をセット。 //yyyy-mm-dd hh mm ssという形式はSQLiteの日付、時刻関数でも認識できる形式。 読解2.データベースの初期設定まで // データベースの初期設定 $conn = init(); //init()はユーザー定義関数(あとで記述されるfunction init()で戻り値は$conn)。 //ユーザー定義関数というのはサブルーチンのようなもんで、一連の処理を書いたものであり、 //必要に応じてそれを呼び出す。 //引数を与えればそれに処理を加えた戻り値が返ってくる。 //引数が無くても処理後の戻り値だけある場合や、引数も戻り値も無い単なるサブルーチンという場合もある。 //function 関数名(引数) { // 処理に必要なプログラム // return(戻り値) // } //関数は上記の形で定義される。このプログラムの場合、関数名はinit()であり、これを書くことで呼び出される。 //引数は無いし、$connの値を戻すだけの関数である。 //$connが何を意味するのか?connection、つまり、接続ということで、 //具体的には$conn = new PDO( sqlite memo.sqlite )という値がinit()でセットされる。 //ともかくここで$connにinit()というユーザー定義関数の戻り値をセットし、直後の処理分岐で使う。 読解3.処理分岐まで if ($act == 保存 and $contents ) { // 保存 if (empty($id)) { // 新規保存 $id = add_data($conn, $title, $contents, $dt); } else { // 既存データの保存 update_data($conn, $id, $title, $contents, $dt); } //もし$act(行為)が 保存 でかつ$contents(本文)がNULLなら保存だけど //$idが空なら新規保存だけどユーザー定義関数add_dataを4つの引数で実行し、戻り値を$idにする。 //それ以外なら既存データの保存で、ユーザー定義関数update_dataを5つの引数($idを含む)で実行。 } elseif ($act == 選択したデータを削除 ) { // 削除 if (isset($_POST[ c1 ])) { delete_data($conn, $_POST[ c1 ]); } else { echo 削除するデータが選択されていません ; } //それ以外でもし$act(行為)が 選択したデータを削除 なら削除だけど、 //フォームのPOSTメソッドのinputで c1 という名前(チェックボックス)で //ブラウザから要求された値(具体的にはidの値)があれば、 //ユーザー定義関数delete_dataを2つの引数$connとidの値で実行する。 //それ以外なら 削除するデータが選択されていません と表示。 } elseif ($act == 全データを削除 ) { // 全データ削除 delete_all_data($conn); //それ以外でもし$act(行為)が 全データを削除 なら全データ削除つまり //ユーザー定義関数delete_all_dataを引数$connで実行する。 } elseif ($act == 新規作成 ) { // 新規作成 clear_data(); //それ以外でもし$act(行為)が 新規作成 新規作成つまり //ユーザー定義関数clear_data();を引数なしで実行する。 } elseif (!empty($id)) { // 編集 $row = get_data($conn, $id); $title = $row[ title ]; $contents = $row[ contents ]; } //!は論理演算子で否定。!aならaでないということ。それ以外でもし$idが空でなければ編集つまり //ユーザー定義関数get_dataを$connと$idの2つの引数で実行し、戻り値を$rowにする。 //$title(題名)をtitle番目の$rowとする。え?row番目の$titleじゃないの? //正しくは$title = $title[ row ];じゃないの? //$contents(本文)をcontents番目の$rowとする。え?え?row番目の$contentsじゃないの? //正しくは$contents = $contents[ row ];じゃないの? //おかしいよ。でもプログラムは正常に動作している。 //僕の思う正しくはのように書き変えたら正常に動作しなかった。そりゃそうだ。 //$rowは行番号ではない!!$idに書かれているデータ(タイトルと本文)である。rowなんて名前にしないで! //この場合の戻り値$rowは、連想配列である。連想配列というのは添字が文字の配列。 //$row[ title ]は、この$idのタイトルのデータ。$row[ contents ]は、この$idの本文のデータ。 //つまり、編集の時に該当$idのタイトルと本文を$titleと$contentsにセットするということ。 //ここで、$rowという変数名について考えておきたい。Excelなどでrowといえば行番号だと反射的に思ってしまったのが //大きな間違い。リレーショナルデータベースにおいて、行というのは、複数のデータの組み合わせを格納する単位である。 //データベース全体を表として見た場合、1つの行は横長に伸びた形で表示される。 //1つの行に含まれるデータはひとかたまりとして扱われ、それぞれの行は主キー($id)によって識別される。 //例えば住所録の場合、氏名や住所・電話番号などを合わせた1人分のデータが1つの行を構成する。 //つまりRDBにおいて、ROWといえばIDによって識別される1件分のデータの塊である。 //だから列を添字とした連想配列で表す。行番号の働きは$idが担っている。 //だいぶ読めてきた。後は心臓部であるユーザー定義関数。 //ここに、具体的にどのようにPHPとSQLiteが連携するのかが書かれている。 //このプログラムは教材だけあって非常に解読しやすく書かれている。 //他人のプログラムは、とかく意味不明理解不能ということになりがちだ。 //ひどい場合には、読めるもんなら読んでみろ! //なんてプログラムを親切そうな顔してわざわざ持ってくる人も居る。有難迷惑だ。 //しかし、このプログラムは自分で書くよりよくわかるような書き方だ。 読解4.データベースの初期設定まで // データベースの初期設定 function init() { // データベースに接続 $conn = new PDO( sqlite memo.sqlite ); // データベースの作成 $sql = CREATE TABLE IF NOT EXISTS memo ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, contents TEXT NOT NULL, dt TEXT NOT NULL ) ; $stmt = $conn- prepare($sql); $stmt- execute(); return $conn; } //いよいよPHPのPDOでSQLiteに接続する。 //$conn = new PDO( sqlite パスとデータベースファイル名 ); //接続の決まり文句。これで$connにPDOクラスのインスタンス(戻り値)がセットされて、接続される。 //$conn = NULL とすれば切断されるが、わざわざやらなくていい。 //普通、PHPはSQLiteにクエリ(query 問い合わせ)を投げかけ、 //SQLiteはその問い合わせ(クエリ)に応じて、回答するが、 //上記の場合は //1.あらかじめSQL文を定義する($sqlにSOL文を代入する。文の意味はコマンドラインの練習でやったようなことなので略)。 //2.必要に応じて値をセットする(prepareにSQL文を引数として渡し、戻り値をプリペアドステートメントとする)。 //3.実行する(execute()でそのプリペアドステートメントを実行する)。 //$connを戻り値として保持しつつ呼び出し元に帰る。 //PDOプリペアドステートメントに対するメソッドや定義済み定数は下記URL参照。 //http //www.phpmanual.jp/ref.pdo.html 読解5.データの追加まで //データの追加(処理分岐では新規保存となっている) function add_data($conn, $title, $contents, $dt) { $sql = INSERT INTO memo(title, contents, dt) VALUES( title, contents, dt) ; $stmt = $conn- prepare($sql); $stmt- bindParam( title , $title); $stmt- bindParam( contents , $contents); $stmt- bindParam( dt , $dt); $stmt- execute(); $id = $conn- lastInsertId(); return $id; } //データの追加(処理分岐では新規保存となっている) //題名、本文、投稿日時を追加するSQL文を$sqlに代入。 //$sqlによるプリペアドステートメントをセットする。 //bindParam - プリペアドステートメントのパラメータに PHP 変数をバインドする //なんてややこしいことがマニュアルに書いてあるが、(引数でもらっている)変数を //プリペアドステートメントの各項目のデータとして入力するって事である。 //$stmt- execute()でプリペアドステートメントを実行。 //$conn- lastInsertId()は最後に追加した行の IDを返す。 //この値を$idとして戻り値とする。 読解6.データの変更まで // データの変更 function update_data($conn, $id, $title, $contents, $dt) { $sql = UPDATE memo SET title = title, contents = contents, dt = dt WHERE id = id ; $stmt = $conn- prepare($sql); $stmt- bindParam( id , $id); $stmt- bindParam( title , $title); $stmt- bindParam( contents , $contents); $stmt- bindParam( dt , $dt); $stmt- execute(); } //データの変更(処理分岐では既存データの保存となっている) //引数でもらったidの題名、本文、投稿日時をとりあえずセットするSQL文を$sqlに代入。 //$sqlによるプリペアドステートメントをセットする。 //bindParam - プリペアドステートメントのパラメータに PHP 変数をバインドする //なんてややこしいことがマニュアルに書いてあるが、(引数でもらっている)変数を //プリペアドステートメントの各項目のデータとして入力するって事。 //$stmt- execute()によりプリペアドステートメントを実行。戻り値無し。 読解7.指定データの削除まで // 指定データの削除 function delete_data($conn, $data) { $sql = DELETE FROM memo WHERE (id = id) ; $stmt = $conn- prepare($sql); for ($i = 0; $i count($data); $i++) { $stmt- bindParam( id , $data[$i]); $stmt- execute(); } clear_data(); } //$dataはチェックボックスの表示で何番目のチェックボックスなのかを示す値。 //未定のidの行を削除するSQL文を$sqlに代入。 //$sqlによるプリペアドステートメントをセットする。 //idを$dataの値とするが、複数チェックされている場合があるので //それぞれの$data(配列変数)のidについて、 //$stmt- execute()によりプリペアドステートメントを実行。(削除実行。) //$data(配列変数)をすべてNULLにする。 読解8.全データの削除まで // 全データの削除 function delete_all_data($conn) { $sql = DELETE FROM memo ; $stmt = $conn- prepare($sql); $stmt- execute(); clear_data(); } //全データを削除するSQL文を$sqlに代入。 //$sqlによるプリペアドステートメントをセットする。 //$stmt- execute()によりプリペアドステートメントを実行。(削除実行。) //$data(配列変数)をすべてNULLにする。 読解9.データのクリアまで // データのクリア function clear_data() { global $id, $title, $contents; $id = ; $title = (無題) ; $contents = ; } //function外でも通用するように$id, $title, $contentsをglobal宣言し、 //それぞれ消す。 読解10.編集データの取得まで // 編集データの取得 function get_data($conn, $id) { $sql = SELECT * FROM memo WHERE id = id ; $stmt = $conn- prepare($sql); $stmt- bindParam( id , $id); $stmt- execute(); $row = $stmt- fetch(PDO FETCH_ASSOC); return $row; } ? //引数でもらったidの行を選択するSQL文を$sqlに代入。 //$sqlによるプリペアドステートメントをセットする。 //引数でもらっているidをプリペアドステートメントのデータとして入力する。 //$stmt- execute()によりプリペアドステートメントを実行。 //fetch(PDO FETCH_ASSOC)は行全体を各カラムを添字とする連想配列として返す。 //行全体を各カラムを添字とする連想配列として$rowに代入する。 //$rowを戻り値として呼び出し元に帰る。 読解11.フォームのHTML form method= POST action= ?php echo $_SERVER[ SCRIPT_NAME ]? table tr td input type= text value= ?php echo $title? size= 50 name= title /td /tr tr td textarea name= contents rows= 10 cols= 60 ?php echo $contents? /textarea /td /tr tr td table tr td input type= hidden value= ?php echo $id? name= id input type= submit value= 保存 name= act /td td input type= submit value= 新規作成 name= act onClick= return confirm( 新規作成します ) /td td input type= submit value= 選択したデータを削除 name= act onClick= return confirm( 削除して良いですか? ) /td td input type= submit value= 全データを削除 name= act onClick= return confirm( 削除して良いですか? ) /td /tr /table /td /tr /table //いくらなんでも読めるが、1行目 // form method= POST action= ?php echo $_SERVER[ SCRIPT_NAME ]? // form method= postまたはget action= URI ~ /form //フォームの送信形式postまたはgetと送信先のURIを記述。 //$_SERVER[ SCRIPT_NAME ]は実行中のスクリプトのパス返す。 //$idは表示しないのでhidden //onClick= return confirm( 確認文 ) はjava環境で確認文つきのボタンとなる このままだとPOSTの度にバックスラッシュ\¥が増殖するので、$titleと$contents二ついてはstripslashes関数で\を取る。そのあたりの改造は下記。 tr td input type= text value= ?php $title=stripslashes($title);echo $title? size= 50 name= title /td /tr tr td textarea name= contents rows= 15 cols= 100 ?php $contents=stripslashes($contents);echo $contents? /textarea /td /tr 読解12.最後まで ?php // 全データの取得 $sql = SELECT * FROM memo ORDER BY dt DESC ; $stmt = $conn- prepare($sql); $stmt- execute(); // データの一覧表示 echo table border=\ 1\ ; echo tr ; echo td 削除 /td ; echo td タイトル /td ; echo td 最終更新時刻 /td ; echo /tr ; while ($row = $stmt- fetch()) { echo tr ; echo td input type=\ checkbox\ name=\ c1[]\ value=\ . $row[ id ] . \ /td ; echo td a href=\ . $_SERVER[ SCRIPT_NAME ] . ?id= . $row[ id ] . \ . $row[ title ] . /a /td ; echo td . $row[ dt ] . /td ; echo /tr ; } echo /table ; ? /form /body /html //ORDER BY dt DESC 登録日時で降順に並び替え。 //while ($row = $stmt- fetch()) { //配列変数である行全体の内容を受け取ることが真である間ということだろう。 //この最後の表示のところのループがイマイチわからん。 //まあ、ここまで読めたら良しとしよう。 //次は改造。
https://w.atwiki.jp/12kokuki/pages/87.html
LIKE用メタ文字のエスケープ SQLiteでもLIKEは使え、%と_がメタ文字になります。%は任意の複数文字、_は任意の一文字に相当。 ここでPerlとかだと\がエスケープ文字で、%や_自体を検索したいときは「\%」等とすればいいはずですが。でもSQLiteには既定のエスケープ文字がないそうで、どれをエスケープ文字に使うか明示しないといけないらしい。こんなふうに。 SELECT * FROM D_SITE WHERE NAME LIKE abc\%あいう ESCAPE \ (\をエスケープ文字として使用) もちろんパターンに%や_が含まれていなければESCAPEを指定する必要もないわけで、さらにエスケープ文字を任意に指定するようにするとなると、こんな感じでしょうか。 function sqlescape($str, $escapechar= $ , $encoding= UTF-8 ) { mb_regex_encoding($encoding); $escape = preg_match( /[%_]/ , $str); if ($escape) $str = mb_ereg_replace( ([%_ .$escapechar. ]) , $escapechar. \1 , $str); return array( str = sqlite_escape_string($str), escape = $escape); } エスケープした結果の文字列(戻り値の先頭要素)と、ESCAPE指定が必要か否か(戻り値の二番目の要素)を返します。 何も考えず、機械的にESCAPE指定をつけとけばいいじゃん、って感じですが、本当かどうかESCAPEをつけると遅くなるという報告もどこかで見たので。 2010/10/21 23 10 29更新
https://w.atwiki.jp/it_certification/pages/174.html
1. 履歴 2. はじめに 3. sqlite3-rubyのインストール3.1. プロキシの設定 3.2. sqlite3-rubyのインストール 3.3 DLLの配置 1. 履歴 2010/09/03 初稿 2. はじめに Ruby on Railsでデータベースを使用する場合は、DBに関するライブラリが必要です。 sqlite3を使用する際に必要となるsqlite3-rubyのインストール手順について記します。 3. sqlite3-rubyのインストール 3.1. プロキシの設定 コマンドプロンプトを開きます。 プロキシを使用する環境の場合は、以下の通りプロキシサーバを設定して下さい。(プロキシサーバを使用しない環境の場合は、設定不要です。) C \ set http_proxy=http // ip address port 3.2. sqlite3-rubyのインストール インストール可能なsqliteに関するライブラリを探します。 C \ gem list --remote sqlite *** REMOTE GEMS *** sqlite-foreigner (0.5.0) sqlite-ruby (2.2.3 ruby mswin32) sqlite3 (0.1.1) sqlite3-dotnet (3.7.2.0) sqlite3-ironruby (0.1.1) sqlite3-ruby (1.3.1 ruby x86-mingw32 x86-mswin32-60, 1.2.5 x86-mswin32, 1.2.3 ms win32) sqlitecache (0.0.1) 「sqlite3-ruby」というライブラリが見つかりましたので、これをインストールします。 C \ gem install sqlite3-ruby ============================================================================= You ve installed the binary version of sqlite3-ruby. It was built using SQLite3 version 3.6.23.1. It s recommended to use the exact same version to avoid potential issues. At the time of building this gem, the necessary DLL files where available in the following download http //www.sqlite.org/sqlitedll-3_6_23_1.zip You can put the sqlite3.dll available in this package in your Ruby bin directory, for example C \Ruby\bin ============================================================================= Successfully installed sqlite3-ruby-1.3.1-x86-mingw32 1 gem installed Installing ri documentation for sqlite3-ruby-1.3.1-x86-mingw32... Installing RDoc documentation for sqlite3-ruby-1.3.1-x86-mingw32... C \ 3.3 DLLの配置 sqlite3-rubyインストール過程で、DLLファイルを配置するように促されます。上記の説明通りにブラウザに以下URLを入力し、zipファイルをダウンロードします。 http //www.sqlite.org/sqlitedll-3_6_23_1.zip ダウンロードしたzipファイルを解凍し、その中に入っているDLLファイルをPATHが通っている位置に格納します。私の場合は、以下のRubyのバイナリファイルが格納されたフォルダに格納しました。 C \Ruby192\bin
https://w.atwiki.jp/skrkino/pages/41.html
SQLite / 結果を必要としない場合(exec) SQLite 接続と切断 接続 //結果を必要としない場合 try { // SQL実行 $sql ="CREATE TABLE test ( a text , b text )"; $db- exec( $sql ); } catch ( PDOException $e ) { // 実行失敗 $err = $db- errorInfo(); die( $err[2] ); } サンプル dbtest.php html head title DB TEST /title /head body ?php //////////////////////////////////////////////////////////// // 結果を必要としない場合 //====================================== // DBに接続 //------------------ // 接続 try { $db = new PDO( sqlite db/test.db ); $db- setAttribute( PDO ATTR_ERRMODE, PDO ERRMODE_EXCEPTION ); } catch ( PDOException $e ){ // 接続失敗 die( Connection failed . $e- getMessage() ); } //------------------ // 出力 print( 接続に成功しました。 br ); //====================================== // テーブル作成 //------------------ try { // SQL実行 $sql ="CREATE TABLE test ( a text , b text )"; $db- exec( $sql ); } catch ( PDOException $e ) { // 実行失敗 $err = $db- errorInfo(); die( $err[2] ); } //------------------ // 出力 print( テーブルを作成しました。 br ); //====================================== // DBとの接続終了 //------------------ // 切断 $db = null; // もしくは //unset($db); //------------------ // 出力 print( 切断しました。 br ); //////////////////////////////////////////////////////////// ? /body /html
https://w.atwiki.jp/skrkino/pages/42.html
SQLite / 結果を必要とする場合(query) SQLite 結果を必要とする場合(query) 接続 // 結果を必要とする場合 try { // SQL実行 $sql = "SELECT * FROM user_ac ;"; $result = $db- query( $sql ); } catch ( PDOException $e ) { // 実行失敗 $err = $db- errorInfo(); die( $err[2] ); } // 結果を出力 foreach($result as $row) { echo $row[ a ]; echo $row[ b ]; } サンプル dbtest.php html head title DB TEST /title /head body ?php //////////////////////////////////////////////////////////// // 結果を必要とする場合 //====================================== // DBに接続 //------------------ // 接続 try { $db = new PDO( sqlite db/test.db ); $db- setAttribute( PDO ATTR_ERRMODE, PDO ERRMODE_EXCEPTION ); } catch ( PDOException $e ){ // 接続失敗 die( Connection failed . $e- getMessage() ); } //------------------ // 出力 print( 接続に成功しました。 br ); //====================================== // レコードを追加 //------------------ try { // SQL実行 $sql ="INSERT INTO test VALUES( aaaaa , bbbbb )"; $db- exec( $sql ); } catch ( PDOException $e ) { // 実行失敗 $err = $db- errorInfo(); die( $err[2] ); } //------------------ // 出力 print( レコードを追加しました。 br ); //====================================== // 結果を出力 //------------------ try { // SQL実行 $sql = "SELECT * FROM test ;"; $result = $db- query( $sql ); } catch ( PDOException $e ) { // 実行失敗 $err = $db- errorInfo(); die( $err[2] ); } // 結果を出力 foreach($result as $row) { echo $row[ a ]; echo $row[ b ]; } //====================================== // DBとの接続終了 //------------------ // 切断 $db = null; // もしくは //unset($db); //------------------ // 出力 print( 切断しました。 br ); //////////////////////////////////////////////////////////// ? /body /html